# -*- coding: utf-8 -*-
# @Time : 2021/10/9 14:04
# @Author : Yinkay·Huang
# @File : tree.py

from turtle import *
from random import *
from math import *


# 画花函数，采用递归+随机数的方式，完成了每一次运行都是随机的花。
# n是递归层数。l是该次递归循环里每一个枝干的长度
def theflower(n, l):
    pd()  # 下笔
    # 此处完成渐变色效果
    # heading():返回turt当前航向；
    # radians():将角度转换为弧度；
    # cos():余弦函数
    t = cos(radians(heading() + 45)) / 8 + 0.25
    pencolor(t, t, t)  # pencolor(t,t,t):渐变色。t:RGB参数。
    pensize(n / 4)  # 设置画笔的宽度
    forward(l)  # 向当前画笔方向移动l像素长度，在此处是画花杆

    if n > 0:
        # 枝干
        b = random() * 15 + 20  # 右枝干偏转角度
        c = random() * 15 + 20  # 左枝干偏转角度
        d = l * (random() * 0.4 + 0.6)  # 下一个枝干的长度
        # 左转一定角度，画左枝干
        left(b)
        theflower(n - 1, d)
        # 右转一定角度，画右枝干
        right(b + c)
        theflower(n - 1, d)
        # 转回来
        left(c)
    else:
        # 花瓣
        right(90)
        n = cos(radians(heading() - 45)) / 4 + 0.5
        pencolor(n * 0.5 + 0.5, 0.4 + n * 0.4, 0.4 + n * 0.4)
        circle(2)
        left(90)
    pu()
    backward(l)


# 落英函数
def fall():
    screen = Screen()
    height, width = 1200, 1200
    screen.delay(0)

    # 定义大小、速度、位置、形状不同
    t = Turtle(visible=False, shape='circle')
    t.penup()
    # 旋转角度
    t.setheading(-10)
    # 坐标是随机的
    t.goto(width / 2, randint(-height / 2, height / 2))
    stars = []
    # 定义大小、速度、位置并存放各自列表中---
    for i in range(200):
        star = t.clone()
        # 决定花瓣的大小
        s = random() / 3
        star.shapesize(s, s)
        star.speed(int(s * 15))
        star.pencolor((s * 3, s * 2.4, s * 2.4))
        star.fillcolor((1, 1, 1))
        # 随机产生坐标
        star.sety(width / 2 + randint(1, width))
        star.setx(randint(-height / 2, height / 2))
        star.showturtle()
        stars.append(star)

    # 启动
    while True:
        for star in stars:
            star.sety(star.ycor() - 3 * star.speed())  # 设置画笔向x方向移动的距离，值为实数
            if star.ycor() < -width / 2:  # 返回海龟当前位置的海龟x坐标
                star.hideturtle()  # 使 turtle 不可见
                star.sety(width / 2 + randint(1, width))
                star.setx(randint(-height / 2, height / 2))
                star.showturtle()  # 使 turtle 可见


speed(0)  # 更改 turtle 的速度，介于0到10之间。
pensize(3)  # 设置画笔的宽度

# 开始画花
bgcolor(1, 1, 1)  # 背景颜色
ht()  # 把小乌龟藏起来
pd()
left(90)  # 更改 turtle 的方向。
f = 5  # 花树的数量
r = 60  # 偏转角度
n = 12  # 递归次数，决定花的密度
l = 75  # 主枝干的长度，决定花环的大小l
tracer(0)
# 循环画花
while f:  # 用while画花环
    # 开始点设置在（0，0）下方，绘画方向往上，所以先左转向再后退。
    pu()  # 画笔抬起，不留下痕迹
    home()  # 原始位置
    left(150)
    goto(0, 0)
    pd()
    right(r)
    r += 60
    theflower(n, l)  # 画花
    n -= 1
    f -= 1
# 开始落英
tracer(1)
fall()

done()  # 暂停程序，停止画笔绘制，但绘图窗体不关闭，直到用户关闭Python Turtle图形化窗口为止。